﻿using System;
using System.Windows.Forms;

namespace EvaluationObjectCalculator
{
    public class InputAndOutputData
    {
        private int rowCount { get; set; }

        /// <summary>
        /// 将剪贴板中的内容粘贴到DataGridView中，并清空粘贴板
        /// </summary>
        /// <param name="dgv_Test"></param>  
        public void Paste(DataGridView dgv_Test)
        {
            int colnum = 0;
            int rownum = 0;
            try
            {
                string clipboardText = Clipboard.GetText(); //获取剪贴板中的内容
                //if (string.IsNullOrEmpty(clipboardText))
                if (clipboardText.Equals("clipboardText"))
                {
                    MessageBox.Show("粘贴板上的内容为空","错误提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }                
                for (int i = 0; i < clipboardText.Length; i++)
                {
                    if (clipboardText.Substring(i, 1) == "\t")
                    {
                        colnum++;
                    }
                    if (clipboardText.Substring(i, 1) == "\n")
                    {
                        rownum++;
                    }
                }
                this.rowCount = rownum;
                //粘贴板上的数据来源于EXCEL时，每行末尾都有\n，来源于DataGridView时，最后一行末尾没有\n
                if (clipboardText.Substring(clipboardText.Length - 1, 1) == "\n")
                {
                    rownum--;
                }
                colnum = colnum / (rownum + 1);
                object[,] data; //定义object类型的二维数组
                data = new object[rownum + 1, colnum + 1];  //根据剪贴板的行列数实例化数组
                string rowStr = "";

                //对数组各元素赋值
                for (int i = 0; i <= rownum; i++)
                {
                    for (int j = 0; j <= colnum; j++)
                    {
                        //一行中的其它列
                        if (j != colnum)
                        {
                            rowStr = clipboardText.Substring(0, clipboardText.IndexOf("\t"));
                            clipboardText = clipboardText.Substring(clipboardText.IndexOf("\t") + 1);
                        }
                        //一行中的最后一列
                        if (j == colnum && clipboardText.IndexOf("\r") != -1)
                        {
                            rowStr = clipboardText.Substring(0, clipboardText.IndexOf("\r"));
                        }
                        //最后一行的最后一列
                        if (j == colnum && clipboardText.IndexOf("\r") == -1)
                        {
                            rowStr = clipboardText.Substring(0);
                        }
                        data[i, j] = rowStr;
                    }
                    //截取下一行及以后的数据
                    clipboardText = clipboardText.Substring(clipboardText.IndexOf("\n") + 1);
                }

                //获取当前选中单元格的列序号
                int colIndex = dgv_Test.CurrentRow.Cells.IndexOf(dgv_Test.CurrentCell);
                //获取当前选中单元格的行序号
                int rowIndex = dgv_Test.CurrentRow.Index;
                for (int i = 0; i <= rownum; i++)
                {
                    dgv_Test.Rows[i + rowIndex].Cells[0].Value = data[i, 0];
                    dgv_Test.Rows[i + rowIndex].Cells[1].Value = data[i, 1];
                }
            }
            catch
            {
                MessageBox.Show("粘贴的数据有误，请重新粘贴数据源","错误提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            finally
            {
                //Clipboard.Clear();
                //dgv_Test.UserSetCursor
            }
        }

        /// <summary>
        /// 输出为excel
        /// </summary>
        /// <param name="dataGridView1"></param>
        public void ToExcel(DataGridView dataGridView1,TextBox tb,int rowCount)
        {
            try
            {
                //没有数据的话就不往下执行  
                if (dataGridView1.Rows.Count == 0)
                    return;
                //实例化一个Excel.Application对象  
                Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();

                //让后台执行设置为不可见，为true的话会看到打开一个Excel，然后数据在往里写  
                excel.Visible = true;

                //新增加一个工作簿，Workbook是直接保存，不会弹出保存对话框，加上Application会弹出保存对话框，值为false会报错  
                excel.Application.Workbooks.Add(true);
                //生成Excel中列头名称  
                excel.Cells[1, 1] = "投标批次";
                excel.Cells[1, 2] =tb.Text.ToString().Trim();
                for (int i = 0; i < dataGridView1.Columns.Count; i++)
                {
                    if (dataGridView1.Columns[i].Visible == true)
                    {
                        excel.Cells[2, i + 1] = dataGridView1.Columns[i].HeaderText;
                    }
                }
                //把DataGridView当前页的数据保存在Excel中  
                for (int i = 0; i < rowCount - 1; i++)
                {
                    for (int j = 0; j < dataGridView1.Columns.Count; j++)
                    {
                        if (dataGridView1.Columns[j].Visible == true)
                        {
                            excel.Cells[i + 3, j + 1] = dataGridView1[j, i].Value;
                        }
                    }
                }

                //设置禁止弹出保存和覆盖的询问提示框  
                excel.DisplayAlerts = false;
                excel.AlertBeforeOverwriting = false;

                //保存工作簿  
                excel.Application.Workbooks.Add(true).Save();
                //保存excel文件  
                excel.Save("D:" + "\\KKHMD.xls");

                //确保Excel进程关闭  
                excel.Quit();
                excel = null;
                GC.Collect();//如果不使用这条语句会导致excel进程无法正常退出，使用后正常退出
            }
            catch (Exception)
            {
                //MessageBox.Show(ex.Message, "错误提示");
            }
        }
    }
}
